import sys
sys.path.append('..')

import json
from tinytroupe.agent import TinyPerson
from tinytroupe.factory import TinyPersonFactory
from tinytroupe.extraction import ResultsExtractor

# 创建工厂实例
factory = TinyPersonFactory("生成具有不同专业背景和个性的中国科学家。")

# 创建三位科学家
scientists = [
    factory.generate_person(
        "一位58岁的男性物理学家，性格严谨认真，热爱古典音乐和下围棋，"
        "擅长理论物理和数学分析，在解决问题时喜欢从基本原理出发。"
    ),
    factory.generate_person(
        "一位45岁的女性数学家，性格活泼开朗，喜欢园艺和烘焙，"
        "擅长数值分析和统计学，解决问题时喜欢用图形化思维。"
    ),
    factory.generate_person(
        "一位35岁的男性计算机科学家，性格沉稳细心，热爱编程和电子游戏，"
        "擅长算法设计和数据分析，解决问题时喜欢用编程思维。"
    )
]

# 获取生成的科学家简介
scientist_bios = factory.generated_minibios
print("\n=== 科学家简介 ===")
for bio in scientist_bios:
    print(bio)
print("================\n")

# TODO: 在这里添加具体的数学计算问题
calculation_problem = """
设Σ为光滑闭曲面，取外侧
[ I = \iint_{\Sigma} (x^3 - x) , dy , dz + (y^3 - y) , dz , dx + (z^3 - z) , dx , dy. ]
（Ⅰ）确定曲面Σ使得I最小，并求I的最小值；
"""

# 让每个科学家进行计算
results = []
for scientist in scientists:
    scientist.change_context("您需要解决一个数学计算问题。请详细说明您的解题思路，并在最后给出明确的数值结果。")
    scientist.listen_and_act(calculation_problem)
    print("-" * 30)

# 提取结果
extractor = ResultsExtractor()
extraction_objective = "提取科学家的计算结果，包括计算方法和最终数值。"

final_results = []
for scientist in scientists:
    res = extractor.extract_results_from_agent(
        scientist,
        extraction_objective=extraction_objective,
        situation="解决数学计算问题",
        fields=["result", "method", "explanation"],  # 添加explanation字段来存储详细解释
        verbose=True
    )
    final_results.append(res)

# 显示详细结果
print("\n=== 详细计算过程 ===")
for i, result in enumerate(final_results):
    print(f"\n科学家{i+1}的解答:")
    print(f"解题思路: {result.get('explanation', '未提供')}")
    print(f"计算方法: {result.get('method', '未提供')}")
    print(f"最终结果: {result.get('result', '未提供')}")
    print("-" * 50)

# 结果投票统计
vote_counts = {}
for result in final_results:
    # 获取计算结果
    calculated_result = result['result']
    # 统计每个结果出现的次数
    if calculated_result not in vote_counts:
        vote_counts[calculated_result] = 0
    vote_counts[calculated_result] += 1

# 输出投票统计
print("\n=== 结果投票统计 ===")
for result, count in vote_counts.items():
    print(f"结果 {result}: {count} 票")
    # 显示选择该结果的科学家们的解题思路
    print("支持该结果的科学家们的解题思路：")
    for i, res in enumerate(final_results):
        if res['result'] == result:
            print(f"  科学家{i+1}: {res.get('method', '未提供方法')}")
    print()

# 找出得票最多的结果
if vote_counts:
    final_answer = max(vote_counts.items(), key=lambda x: x[1])
    print(f"\n最终采纳的答案是: {final_answer[0]} (获得 {final_answer[1]} 票)")
    
    # 如果存在平票情况
    max_votes = final_answer[1]
    tied_results = [result for result, count in vote_counts.items() if count == max_votes]
    if len(tied_results) > 1:
        print(f"注意：存在平票情况，平票的结果有: {tied_results}")
        print("\n各平票结果的解题思路：")
        for tied_result in tied_results:
            print(f"\n结果 {tied_result} 的支持者：")
            for i, res in enumerate(final_results):
                if res['result'] == tied_result:
                    print(f"科学家{i+1}的解题思路: {res.get('method', '未提供方法')}")
else:
    print("\n没有有效的计算结果")